import { api } from '../utils/apiWrapper.js'
import apiConfig from '../utils/apiConfig.js'
// 文件上传相关API接口

/**
 * 单文件上传
 * @param {File} file - 要上传的文件
 * @returns {Promise} 上传结果
 */
export const uploadSingleFile = async (file) => {
  const formData = new FormData()
  formData.append('file', file)
  
  return api.post('/api/upload/single', formData)
}

/**
 * 多文件上传
 * @param {File[]} files - 要上传的文件数组
 * @returns {Promise} 上传结果
 */
export const uploadMultipleFiles = async (files) => {
  const formData = new FormData()
  files.forEach((file, index) => {
    formData.append('files', file)
  })
  
  return api.post('/api/upload/multiple', formData)
}

/**
 * 获取文件列表
 * @param {Object} params - 查询参数
 * @param {string} params.type - 文件类型 (image, application, text)
 * @param {number} params.page - 页码
 * @param {number} params.limit - 每页数量
 * @returns {Promise} 文件列表
 */
export const getFileList = async (params = {}) => {
  return api.get('/api/upload/files', params)
}

/**
 * 获取文件信息
 * @param {string} filename - 文件名
 * @param {string} type - 文件类型
 * @returns {Promise} 文件信息
 */
export const getFileInfo = async (filename, type) => {
  return api.get(`/api/upload/files/${filename}/info`, { type })
}

/**
 * 删除文件
 * @param {string} filename - 文件名
 * @param {string} type - 文件类型
 * @returns {Promise} 删除结果
 */
export const deleteFile = async (filename, type) => {
  return api.delete(`/api/upload/files/${filename}`, { type })
}

/**
 * 获取文件完整URL
 * @param {string} filename - 文件名
 * @param {string} type - 文件类型
 * @param {string} baseUrl - 基础URL，默认为admin-app服务器地址
 * @returns {string} 完整的文件访问URL
 */
export const getFileUrl = (filename, type, baseUrl = apiConfig.getBaseURLSync()) => {
  return `${baseUrl}/uploads/${type}/${filename}`
}

/**
 * 获取文件下载URL
 * @param {string} filename - 文件名
 * @param {string} type - 文件类型
 * @param {string} baseUrl - 基础URL，默认为admin-app服务器地址
 * @returns {string} 完整的文件下载URL
 */
export const getFileDownloadUrl = (filename, type, baseUrl = apiConfig.getBaseURLSync()) => {
  return `${baseUrl}/api/upload/download/${filename}?type=${type}`
}

/**
 * 文件上传进度监控
 * @param {File} file - 文件对象
 * @param {Function} onProgress - 进度回调函数
 * @param {Function} onSuccess - 成功回调函数
 * @param {Function} onError - 错误回调函数
 */
export const uploadFileWithProgress = (file, onProgress, onSuccess, onError) => {
  const formData = new FormData()
  formData.append('file', file)
  
  const xhr = new XMLHttpRequest()
  
  // 进度事件
  xhr.upload.addEventListener('progress', (event) => {
    if (event.lengthComputable) {
      const percentComplete = (event.loaded / event.total) * 100
      onProgress && onProgress(percentComplete)
    }
  })
  
  // 完成事件
  xhr.addEventListener('load', () => {
    if (xhr.status === 200) {
      try {
        const response = JSON.parse(xhr.responseText)
        onSuccess && onSuccess(response)
      } catch (error) {
        onError && onError(new Error('响应解析失败'))
      }
    } else {
      onError && onError(new Error(`上传失败: ${xhr.status}`))
    }
  })
  
  // 错误事件
  xhr.addEventListener('error', () => {
    onError && onError(new Error('网络错误'))
  })
  
  // 发送请求 - 使用正确的API基础URL
  const baseURL = apiConfig.getBaseURLSync()
  const uploadUrl = `${baseURL}/api/upload/single`
  xhr.open('POST', uploadUrl)
  xhr.send(formData)
  
  return xhr
}

/**
 * 批量文件上传（带进度）
 * @param {File[]} files - 文件数组
 * @param {Function} onProgress - 总体进度回调
 * @param {Function} onFileProgress - 单个文件进度回调
 * @param {Function} onSuccess - 成功回调
 * @param {Function} onError - 错误回调
 */
export const uploadMultipleFilesWithProgress = (files, onProgress, onFileProgress, onSuccess, onError) => {
  let completedFiles = 0
  let totalFiles = files.length
  const results = []
  const errors = []
  
  const processNext = (index) => {
    if (index >= files.length) {
      // 所有文件处理完成
      if (errors.length === 0) {
        onSuccess && onSuccess(results)
      } else {
        onError && onError(errors)
      }
      return
    }
    
    const file = files[index]
    const formData = new FormData()
    formData.append('files', file)
    
    const xhr = new XMLHttpRequest()
    
    // 单个文件进度
    xhr.upload.addEventListener('progress', (event) => {
      if (event.lengthComputable) {
        const percentComplete = (event.loaded / event.total) * 100
        onFileProgress && onFileProgress(index, file.name, percentComplete)
      }
    })
    
    // 单个文件完成
    xhr.addEventListener('load', () => {
      if (xhr.status === 200) {
        try {
          const response = JSON.parse(xhr.responseText)
          results.push(response)
        } catch (error) {
          errors.push({ file: file.name, error: '响应解析失败' })
        }
      } else {
        errors.push({ file: file.name, error: `上传失败: ${xhr.status}` })
      }
      
      completedFiles++
      onProgress && onProgress((completedFiles / totalFiles) * 100)
      
      // 处理下一个文件
      processNext(index + 1)
    })
    
    // 单个文件错误
    xhr.addEventListener('error', () => {
      errors.push({ file: file.name, error: '网络错误' })
      completedFiles++
      onProgress && onProgress((completedFiles / totalFiles) * 100)
      processNext(index + 1)
    })
    
    // 发送请求
    const baseURL = apiConfig.getBaseURLSync()
    const uploadUrl = `${baseURL}/api/upload/multiple`
    xhr.open('POST', uploadUrl)
    xhr.send(formData)
  }
  
  // 开始处理第一个文件
  processNext(0)
}

/**
 * 文件类型检查
 * @param {File} file - 文件对象
 * @returns {boolean} 是否为允许的文件类型
 */
export const isAllowedFileType = (file) => {
  const allowedTypes = [
    'image/jpeg', 'image/png', 'image/gif', 'image/webp',
    'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    'text/plain', 'text/csv', 'application/zip', 'application/x-rar-compressed'
  ]
  
  return allowedTypes.includes(file.type)
}

/**
 * 文件大小检查
 * @param {File} file - 文件对象
 * @param {number} maxSize - 最大文件大小（字节），默认50MB
 * @returns {boolean} 文件大小是否在允许范围内
 */
export const isAllowedFileSize = (file, maxSize = 50 * 1024 * 1024) => {
  return file.size <= maxSize
}

/**
 * 文件验证
 * @param {File} file - 文件对象
 * @returns {Object} 验证结果 { valid: boolean, errors: string[] }
 */
export const validateFile = (file) => {
  const errors = []
  
  if (!isAllowedFileType(file)) {
    errors.push('不支持的文件类型')
  }
  
  if (!isAllowedFileSize(file)) {
    errors.push('文件大小超出限制（最大50MB）')
  }
  
  return {
    valid: errors.length === 0,
    errors
  }
}

/**
 * 批量文件验证
 * @param {File[]} files - 文件数组
 * @returns {Object} 验证结果 { valid: boolean, errors: Array, validFiles: File[] }
 */
export const validateMultipleFiles = (files) => {
  const errors = []
  const validFiles = []
  
  files.forEach((file, index) => {
    const validation = validateFile(file)
    if (!validation.valid) {
      errors.push({
        index,
        filename: file.name,
        errors: validation.errors
      })
    } else {
      validFiles.push(file)
    }
  })
  
  return {
    valid: errors.length === 0,
    errors,
    validFiles
  }
} 